// 包声明：属于监控模块的API接口层   提供服务器状态的监控数据（企业管理界面展示）
package monitor

import (
	"ferry/tools/app" //项目自定义响应工具包
	"runtime"         //go运行时信息获取包

	"github.com/gin-gonic/gin"        //web框架gin
	"github.com/shirou/gopsutil/cpu"  //跨平台CPU信息获取库
	"github.com/shirou/gopsutil/disk" //磁盘信息获取库
	"github.com/shirou/gopsutil/mem"  //内存信息获取库
)

// 存储单位常量定义（单位：字节）
const (
	B  = 1         //1字节
	KB = 1024 * B  //千字节
	MB = 1024 * KB //兆字节
	GB = 1024 * MB //吉字节
)

// 函数定义：处理服务器监控信息的API端点
func ServerInfo(c *gin.Context) {

	//创建操作系统信息字典
	osDic := make(map[string]interface{}, 0)
	//运行时信息采集
	osDic["goOs"] = runtime.GOOS                   //操作系统类型（如Linux/windows）
	osDic["arch"] = runtime.GOARCH                 //CPU架构 （amd64/arm64）
	osDic["mem"] = runtime.MemProfileRate          // 内存分析采样率（默认512KB）
	osDic["compiler"] = runtime.Compiler           // 使用的编译器（gc/gccgo）
	osDic["version"] = runtime.Version()           //go的语言版本
	osDic["numGoroutine"] = runtime.NumGoroutine() //当前活跃的goroutine数量

	//磁盘信息采集（/）
	dis, _ := disk.Usage("/")
	//忽略错误获得磁盘使用数据（潜在问题点）
	diskTotalGB := int(dis.Total) / GB         //总容量（单位：GB）
	diskFreeGB := int(dis.Free) / GB           //可用空间（单位：GB）
	diskDic := make(map[string]interface{}, 0) //创建磁盘信息字典
	diskDic["total"] = diskTotalGB             //总空间
	diskDic["free"] = diskFreeGB               //剩余空间

	//内存信息采集
	mem, _ := mem.VirtualMemory()             //忽略错误获得内存使用数据（潜在问题点）
	memUsedMB := int(mem.Used) / GB           //已用内存（单位：MB）
	memTotalMB := int(mem.Total) / GB         //总内存（单位：MB）
	memFreeMB := int(mem.Free) / GB           //剩余内存（单位：MB）
	memUsedPercent := int(mem.UsedPercent)    //已用内存百分比
	memDic := make(map[string]interface{}, 0) //创建内存信息字典
	memDic["total"] = memTotalMB              //输出 示例 ：32GB
	memDic["used"] = memUsedMB                //12GB
	memDic["free"] = memFreeMB                //20GB
	memDic["usage"] = memUsedPercent          //37%

	//CPU信息采集

	cpuDic := make(map[string]interface{}, 0) //创建CPU信息字典
	cpuDic["cpuNum"], _ = cpu.Counts(false)   //物理核心数（逻辑核用true参数）

	//构建统一响应（假设app.Custum封装了响应格式）
	app.Custum(c, gin.H{
		//HTTP状态码
		"code": 200,
		//包含6个操作系统相关指标
		"os": osDic,
		//包含4个内存指标
		"mem": memDic,
		//包含核心数
		"cpu": cpuDic,
		//包含2个磁盘指标
		"disk": diskDic,
	})
}
